const Koa=require('koa');
const path=require('path')
const render=require('koa-art-template')
const static=require('koa-static')

let config=require('./store/config')
const {gJs,Wechat}=require('./controller/init_chat');
const sendContent=require('./store/send_msg')
let wechat=new Wechat(config.wechat)

const wchat=require('./controller/wechat')
const app=new Koa();
app.listen(8080);
console.log('8080')

render(app,{
    root:path.join(__dirname,'views'),
    extname:'.html',
    //debug:false则每次压缩页面及js(含混淆、静态数据不会实时更新（不每次都读文件
    debug:process.env.NODE_ENV!=='production'
})

const koaBody = require('koa-body');
app.use(koaBody({
    multipart:true, // 支持文件上传
    formidable:{
        uploadDir:'./public/upload_cover', // 设置文件上传目录
        keepExtensions: true,    // 保持文件的后缀
    }
}));

const session=require('koa-session')
app.keys=['session']
let store={
    storage:{},
    get(key){
        return this.storage[key]
    },
    set(key,session){
        this.storage[key]=session
    },
    destroy(key){
        delete this.storage[key]
    }
}
app.use(session({store:store},app))
//下句是 视图与数据传输中间件（前台{{user}}与后台共享user）,要放需要共享的数据后面
app.use(async (ctx,next) => {
    ctx.state.user=ctx.session.user;  //本例共享ctx.session.user
    await next()  //这只是存储ctx.state.xx步骤，无论结果都要放行，否则卡在这不会往下执行
})
app.use(async (ctx,next)=>{   //在处理网址前一步做抛错处理，可以做一个优雅的处理错误
    try{
        await next()    //主要是错误处理，如果没有抛来错误，当然要next()放行
    }catch(err){
        ctx.render('error',{msg:'002',err})  //做一个error错误的html页面
    }
})

app.use(wchat.checkWchat)   //校验微信有没授权，没有则授权api请求
app.use(wchat.getWchatInfo)  //如果没有授权且用户按了同意，用code请求api换取用户信息
 // //注意域名80端口映射这8080就行，或者直接在这服务端设置80
app.use(async (ctx,next) => {
    if(ctx.href.indexOf('dy')>-1){
        // let timestamp=parseInt(new Date().getTime()/1000,10)+'' //最后输出要是字符串
        // let noncestr=Math.random().toString(36).substr(2,15)
        // let signature =await wechat.getTicket(noncestr,timestamp,ctx.href)
        // let wxConfig={ //在公众号后台jssdk配置授权域名，一定是wx.com主域名！！不带http和www
        //     appId: config.wechat.appID, // 必填，公众号的唯一标识
        //     timestamp:timestamp , // 必填，生成签名的时间戳，一定要转字符串
        //     nonceStr: noncestr, // 必填，生成签名的随机串36进制，即含英文
        //     signature: signature// 必填，文档附录1有教
        //     //js接口列表可在前台设置
        // };
        // await ctx.render("index",{wxConfig})
    }else{
        let bool=await gJs(ctx,config.wechat)
        if(bool){
            await console.log('ok')
            await sendContent(ctx,config.wechat)
        }
    }
    await next()
})


app.use(async (ctx,next)=>{
    //下面是为了防止前端链接如果带有./public出错，重写url去掉pubilc后发给后台识别。控制台看是没去掉的
    if (ctx.url.startsWith('/public')) ctx.url=ctx.url.replace('/public','');
    await next()
})
app.use(static(path.resolve('./public')))
const connect=require('./model/connectdb')
app.use(async (ctx,next) => {
    await connect.connectEnv();
    await next()
})
const router=require('./routers/router')
app.use(router.routes())
app.use(router.allowedMethods())